"""
交互式截图工具 - 打包脚本
使用 PyInstaller 将程序打包成独立的 .exe 文件
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def clean_build_folders():
    """清理旧的构建文件"""
    print("清理旧的构建文件...")
    folders_to_clean = ['build', 'dist', '__pycache__']
    files_to_clean = ['交互式截图工具.spec']
    
    for folder in folders_to_clean:
        if os.path.exists(folder):
            shutil.rmtree(folder)
            print(f"  [OK] 已删除: {folder}")
    
    for file in files_to_clean:
        if os.path.exists(file):
            os.remove(file)
            print(f"  [OK] 已删除: {file}")

def create_icon():
    """创建程序图标（如果需要）"""
    # 这里可以添加图标创建逻辑
    # 目前使用默认图标
    pass

def build_exe():
    """使用 PyInstaller 打包程序"""
    print("\n开始打包程序...")
    print("="*60)
    
    # PyInstaller 命令
    cmd = [
        'pyinstaller',
        '--name=交互式截图工具',                    # 程序名称
        '--onefile',                               # 打包成单个文件
        '--windowed',                              # 无控制台窗口（GUI模式）
        '--add-data=requirements.txt;.',           # 包含依赖文件
        '--hidden-import=undetected_chromedriver', # 隐藏导入
        '--hidden-import=selenium',
        '--hidden-import=PIL',
        '--hidden-import=PIL.Image',
        '--hidden-import=keyboard',
        '--hidden-import=tkinter',
        '--collect-all=undetected_chromedriver',   # 收集所有相关文件
        '--noconfirm',                             # 不询问覆盖
        'interactive_screenshot.py'                 # 主程序
    ]
    
    print(f"执行命令: {' '.join(cmd)}\n")
    
    # 执行打包
    result = subprocess.run(cmd, capture_output=False, text=True)
    
    if result.returncode == 0:
        print("\n" + "="*60)
        print("[成功] 打包成功！")
        return True
    else:
        print("\n" + "="*60)
        print("[失败] 打包失败！")
        return False

def create_launcher():
    """创建一个带控制台的启动器（用于查看日志）"""
    print("\n创建启动器...")
    
    # 还需要创建一个带控制台的版本，方便调试
    cmd = [
        'pyinstaller',
        '--name=交互式截图工具_调试版',
        '--onefile',
        '--console',                               # 保留控制台窗口
        '--add-data=requirements.txt;.',
        '--hidden-import=undetected_chromedriver',
        '--hidden-import=selenium',
        '--hidden-import=PIL',
        '--hidden-import=PIL.Image',
        '--hidden-import=keyboard',
        '--hidden-import=tkinter',
        '--collect-all=undetected_chromedriver',
        '--noconfirm',
        'interactive_screenshot.py'
    ]
    
    result = subprocess.run(cmd, capture_output=False, text=True)
    
    if result.returncode == 0:
        print("  [OK] 调试版本创建成功")
        return True
    else:
        print("  [警告] 调试版本创建失败")
        return False

def copy_readme():
    """复制使用说明到输出目录"""
    print("\n复制使用说明...")
    
    if os.path.exists('dist'):
        readme_files = [
            '交互式截图使用说明.md',
            'README.md'
        ]
        
        for readme in readme_files:
            if os.path.exists(readme):
                shutil.copy(readme, 'dist/')
                print(f"  [OK] 已复制: {readme}")

def create_release_package():
    """创建发布包"""
    print("\n创建发布包...")
    
    if not os.path.exists('dist'):
        print("  [警告] dist 目录不存在")
        return
    
    # 创建使用说明
    readme_content = """# 交互式截图工具 - 使用说明

## 系统要求

1. **Windows 10/11** 操作系统
2. **Chrome 浏览器** 或 **Edge 浏览器**（必须已安装）
3. **网络连接**（首次运行需要下载 ChromeDriver）

## 快速开始

### 方法 1：双击运行（推荐）

1. 双击 `交互式截图工具.exe`
2. 浏览器会自动打开并显示控制器窗口
3. 点击控制器上的按钮进行截图

### 方法 2：调试模式

1. 双击 `交互式截图工具_调试版.exe`
2. 会显示控制台窗口，方便查看日志和错误信息

## 功能说明

### 单页拼接
- 点击"单页拼接"按钮
- 自动滚动截取当前页面的完整长图
- 自动拼接成一张图片

### 多页拼接
1. 点击"多页拼接"按钮启动多页模式
2. 在不同页面分别点击"多页拼接"
3. 收集完所有页面后，再次点击"完成拼接"
4. 所有页面会垂直拼接成一张大图

### 快捷键
- **F9**：快速截图（如果支持）

## 反检测功能

✅ 已启用反检测功能：
- 隐藏 WebDriver 特征
- 模拟人类浏览行为
- 随机延迟和滚动
- 每次截图前会模拟浏览 8-16 秒

## 常见问题

### Q1: 首次运行很慢？
A: 首次运行需要下载 ChromeDriver，请耐心等待并保持网络连接。

### Q2: 提示找不到 Chrome？
A: 请先安装 Chrome 或 Edge 浏览器。

### Q3: 截图在哪里？
A: 截图保存在程序所在目录：
- 单页：`fullpage_screenshot_时间戳.png`
- 多页：`multi_page_screenshot_时间戳.png`

### Q4: 程序无法启动？
A: 尝试以下方法：
1. 使用"调试版"查看错误信息
2. 关闭杀毒软件重试
3. 以管理员身份运行

### Q5: Chrome配置文件在哪？
A: 程序会在运行目录自动创建 `chrome_profile` 文件夹保存浏览器配置。

## 技术支持

如有问题，请查看调试版本的控制台输出。

---

**版本**: v2.0 反检测版
**最后更新**: 2025年10月
"""
    
    readme_path = os.path.join('dist', '使用说明.txt')
    with open(readme_path, 'w', encoding='utf-8') as f:
        f.write(readme_content)
    print(f"  [OK] 已创建: 使用说明.txt")
    
    print("\n" + "="*60)
    print("[完成] 发布包已准备完成！")
    print("="*60)
    print(f"\n发布目录: {os.path.abspath('dist')}")
    print("\n包含文件:")
    
    if os.path.exists('dist'):
        for item in os.listdir('dist'):
            item_path = os.path.join('dist', item)
            if os.path.isfile(item_path):
                size = os.path.getsize(item_path) / 1024 / 1024
                print(f"  • {item} ({size:.2f} MB)")

def main():
    """主函数"""
    print("="*60)
    print("交互式截图工具 - 打包程序")
    print("="*60)
    
    # 检查当前目录
    if not os.path.exists('interactive_screenshot.py'):
        print("[错误] 找不到 interactive_screenshot.py")
        print("   请在程序目录中运行此脚本")
        sys.exit(1)
    
    try:
        # 1. 清理旧文件
        clean_build_folders()
        
        # 2. 打包主程序
        if not build_exe():
            print("\n[错误] 主程序打包失败，退出")
            sys.exit(1)
        
        # 3. 打包调试版本
        create_launcher()
        
        # 4. 复制说明文档
        copy_readme()
        
        # 5. 创建发布包
        create_release_package()
        
        print("\n" + "="*60)
        print("[成功] 所有任务完成！")
        print("="*60)
        print("\n下一步：")
        print("1. 测试 dist 目录中的 .exe 文件")
        print("2. 将整个 dist 目录打包成 .zip 发送给用户")
        print("3. 用户解压后直接运行 .exe 文件即可")
        
    except KeyboardInterrupt:
        print("\n\n[警告] 用户中断")
        sys.exit(1)
    except Exception as e:
        print(f"\n[错误] 发生错误: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

if __name__ == '__main__':
    main()

